﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using System.Data;

namespace l1cs.server.datatables
{
    class IpTable
    {
        private static Logger _log = Logger.getLogger( typeof( IpTable ).FullName );

        private List<String> _banip = new List<String>();

        private static IpTable _instance;

        public static IpTable getInstance()
        {
            if ( _instance == null )
            {
                _instance = new IpTable();
            }
            return _instance;
        }

        private IpTable()
        {/*TTOK*/
            String sqlstr = "SELECT * FROM ban_ip";
            using ( MySqlWrapper wrapper = new MySqlWrapper() )
            {
                foreach ( DataRow item in wrapper.GetDataTable( sqlstr ).Rows )
                {
                    _banip.Add( Convert.ToString( item["ip"] ) );
                }
            }
        }

        /// <summary>
        /// アクセス禁止IPアドレスを追加する。
        /// </summary>
        /// <param name="ip">アクセス禁止IPアドレス</param>
        public void banIp( String ip )
        {/*TTOK*/
            String sqlstr = "INSERT INTO ban_ip SET ip=?ip";
            using ( MySqlWrapper wrapper = new MySqlWrapper() )
            {
                MySqlCommand cmd = new MySqlCommand( sqlstr );
                cmd.Parameters.Add( "?ip", MySqlDbType.String ).Value = ip;
                wrapper.ExecNonQuery( cmd );
            }

            _banip.Add( ip );
        }

        /// <summary>
        /// アクセス禁止されてるか判断します。
        /// </summary>
        /// <param name="s">判断するIPアドレス</param>
        /// <returns>Trueなら禁止</returns>
        public bool isBannedIp( String s )
        {/*TTOK*/
            return _banip.Contains( s );
        }

        /// <summary>
        /// アクセス禁止を解除する。
        /// </summary>
        /// <param name="ip">解除するIPアドレス</param>
        /// <returns></returns>
        public bool liftBanIp( String ip )
        {/*TTOK*/
            bool ret = false;
            String sqlstr = "DELETE FROM ban_ip WHERE ip=?ip";
            using ( MySqlWrapper wrapper = new MySqlWrapper() )
            {
                MySqlCommand cmd = new MySqlCommand( sqlstr );
                cmd.Parameters.Add( new MySqlParameter( "?ip", (Object)ip ) );
                wrapper.ExecNonQuery( cmd );
            }
            ret = _banip.Remove( ip );

            return ret;
        }
    }
}
